/**
 * JS名空间绑定函数
 * @return {Object}
 */
$.namespace = function () {
	var obj = {}, space;
	$.each(arguments, function (index, str) {
		//以点分开字符串，得到字符串数组
		space = str.split(".");
		//将第一个字符串数组第一个字符串作为window对象的一个属性
		obj = window[space[0]] = window[space[0]] || {};
		//依次地将字符串数组中的下一个字符串作为上一个字符串对应的对象（已经处理过）的属性
		$.each(space.slice(1), function (i, o) {
			obj = obj[o] = obj[o] || {};
		})
	});
	return obj
};
/**
 * 绑定一个cdms.common的名空间
 */
$.namespace("cdms.common");
$.namespace("language");
/**
 * String format
 * @memberOf {String}
 * @return {String}
 */
String.prototype.format = function () {
	var s = this, i = arguments.length;
	while (i--) {
		s = s.replace(new RegExp('\\{' + i + '\\}', 'gm'), arguments[i]);
	}
	return s;
};
/**
 * 判断数组中是否包含指定的元素
 * @param element  元素
 * @return {boolean}   true，存在
 */
Array.prototype.contains = function (element) {
	for (var i = 0; i < this.length; i++) {
		if (this[i] == element) {
			return true;
		}
	}
	return false;
};
/**
 * cdms.common名空间具体实现
 * @type cdms.common
 */
cdms.common = function () {
	//noinspection JSValidateTypes
	return {
		/**
		 * 使用ajax提交数据
		 * @param the_url 远程服务接口
		 * @param the_param 需要提交的数据
		 * @param succ_callback 成功后需要执行的函数
		 */
		ajax_post             : function (the_url, the_param, succ_callback) {
			$.ajax({
				type   : 'POST',
				cache  : false,
				url    : the_url,
				data   : the_param,
				success: function (data) {
					var json = (data.type || data);
					if (json.type == undefined || json.type) {
						succ_callback(data);
					} else {
						cdms.common.show_ajax_msg(data);
					}
				},
				error  : function (html) {
					cdms.common._ajax_error(html);
				}
			})
		},
		/**
		 * 使用ajax获取数据
		 * @param the_url 远程服务接口
		 * @param succ_callback 成功后执行的方法
		 */
		ajax_get              : function (the_url, succ_callback) {
			$.ajax({
				type   : 'GET',
				cache  : false,
				url    : the_url,
				success: function (data) {
					var json = (data.type || data);
					if (json.type == undefined || json.type) {
						succ_callback(data);
					} else {
						cdms.common.show_ajax_msg(data);
					}
				},
				error  : function (html) {
					cdms.common._ajax_error(html);
				}
			})
		},
		/**
		 * 同步ajax请求，当有些数据需要同步获取下来后才能进行的操作，可以调用同步方法。
		 * @param the_url   同步请求URL
		 * @param succ_callback 同步请求回调事件
		 */
		ajax_sync_get         : function (the_url, succ_callback) {
			$.ajax({
				type   : 'GET',
				cache  : true,
				async  : false,
				url    : the_url,
				success: function (data) {
					var json = (data.type || data);
					if (json.type == undefined || json.type) {
						succ_callback(data);
					} else {
						cdms.common.show_ajax_msg(data);
					}
				},
				error  : function (html) {
					cdms.common._ajax_error(html);
				}
			});
		},
		/**
		 * 获取某个表格的选中ID
		 * @param grid_id 表格ID
		 * @return 选中的ID,如果没有选中，则返回undefined
		 */
		grid_select_ids       : function (grid_id) {
            var rows = $('#' + grid_id).grid("checkedRows");
            if (rows.length == 0) {
                $.alert(language.issue.not_checked, language.note.alert_title);
                return undefined;
            }
			var ids = [];
			for (var i = 0; i < rows.length; i++) {
				var rowData = rows[i].attr("data");
				ids.push(rowData.id);
			}
			return ids.join(',');
		},
		/**
		 * 清理表格的分页页码Cookie
		 * @param grid_id      表格ID
		 */
		clear_grid_page_cookie: function (grid_id) {
			var page_cookie_name = grid_id + "_page_index";
			$.cookie(page_cookie_name, null);
		},
		/**
		 * 封装Jart grid的一些公共属性
		 * @param grid_id   表格 dom id
		 * @param options  表格参数
		 */
		jart_grid             : function (grid_id, options) {
			var page_cookie_name = grid_id + "_page_index";
			var page_index = $.cookie(page_cookie_name);
			if (!page_index) {
				page_index = 1;
			}
			var opt = {
				rownumbers   : true,
				showCheckBox : true,
				gridline     : 'none',
				pageMode     : 'remote',
				pageSize     : 15,
				sortOrder    : 'desc',
				pageIndex    : page_index,
				block        : true,
				striped      : true,
				filly        : false,
				sortMode     : 'remote',
				borders      : '1,1,1,1',
				method       : 'get',
				loadMsg      : language.common.loadMsg,
				onloadSuccess: function () {
					//设置cookie
					var ctl = this.node.parent().jart();
					$.cookie(page_cookie_name, ctl.attr('pageindex'), { expires: 1 });
				}};
			$.extend(opt, options);
			var grid = $('#' + grid_id).grid(opt);
			var pager = grid.attr('pager');
			pager.attr('template', 'textMode');
			return grid;
		},
		/**
		 * 清理所有的Cookie
		 */
		cleanup_cookie        : function () {
			//获取所有Cookie，并把它变成数组
			var cookies = document.cookie.split(";");
			//循环每一个数组项，把expires设置为过去时间，这样很容易地消除了所有Cookie
			for (var i = 0; i < cookies.length; i++) {
				var cookie = cookies[i];
				var eqPos = cookie.indexOf("=");
				var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;
				$.cookie(name, null);
			}
		},
		form_submit           : function (form_id, options, succ_callback) {
			var opt = {dataType: 'json',
				beforeSubmit   : function () {
					if (!$.isValid()) {
						return false;
					}
				}, success     : succ_callback};
			$.extend(opt, options);
			$('#' + form_id).ajaxForm(opt);
		},
		/**
		 * 确认提示框
		 * @param msg 提示信息
		 * @param succ_back 确认后执行的函数
		 */
		confirm               : function (msg, succ_back) {
			$.confirm({"title": "温馨提示", "message": msg, "fnOk": succ_back});
		},
		/**
		 * 字符串HTMl编码
		 * @param str 需要转换的字符串
		 * @return {String} 转换后的字符串
		 */
		html_encode           : function (str) {
			var s = "";
			if (str.length == 0) return "";
			s = str.replace(/&/g, "&amp;");
			s = s.replace(/</g, "&lt;");
			s = s.replace(/>/g, "&gt;");
			//s = s.replace(/ /g, "&nbsp;");
			s = s.replace(/\'/g, "&#39;");
			s = s.replace(/\"/g, "&quot;");
			//s = s.replace(/\n/g, "<br>");
			return s;
		},
		/**
		 * 字符串HTMl解码
		 * @param str 解码字符串
		 * @return {String} 解码后的字符串
		 */
		html_decode           : function (str) {
			var s = "";
			if (str.length == 0) return "";
			s = str.replace(/&gt;/g, "&");
			s = s.replace(/&lt;/g, "<");
			s = s.replace(/&gt;/g, ">");
			s = s.replace(/&nbsp;/g, " ");
			s = s.replace(/&#39;/g, "\'");
			s = s.replace(/&quot;/g, "\"");
			s = s.replace(/<br>/g, "\n");
			return s;
		},
		/**
		 * js 的 has_map对象
		 */
		has_map               : function () {
			/** Map 大小 **/
			var size = 0;
			/** 对象 **/
			var entry = new Object();

			/** 存 **/
			this.put = function (key, value) {
				if (!this.containsKey(key)) {
					size++;
				}
				entry[key] = value;
			};
			/** 取 **/
			this.get = function (key) {
				if (this.containsKey(key)) {
					return entry[key];
				}
				else {
					return null;
				}
			};
			/** 删除 **/
			this.remove = function (key) {
				if (delete entry[key]) {
					size--;
				}
			};

			/** 是否包含 Key **/
			this.containsKey = function (key) {
				return (key in entry);
			};

			/** 是否包含 Value **/
			this.containsValue = function (value) {
				for (var prop in entry) {
					if (entry[prop] == value) {
						return true;
					}
				}
				return false;
			};
			/** 所有 Value **/
			this.values = function () {
				var values = new Array(size);
				for (var prop in entry) {
					values.push(entry[prop]);
				}
				return values;
			};

			/** 所有 Key **/
			this.keys = function () {
				var keys = new Array(size);
				for (var prop in entry) {
					keys.push(prop);
				}
				return keys;
			};

			/** Map Size **/
			this.size = function () {
				return size;
			};
		},
		/**
		 * ajax错误提示信息
		 * @param html 服务接口返回的信息
		 * @private
		 */
		_ajax_error           : function (html) {
			$.alert("提交数据失败，代码:" + html.status + ",请稍后再试.");
		},
		/**
		 *在表格的td中 显示错误信息
		 * @param msg_tr_id 单元行tr的id
		 */
		show_error            : function (msg_tr_id, msg) {
			var tr = $('#' + msg_tr_id);
			tr.hide();
			$('#' + msg_tr_id + ' td').html("<div class='error_msg'>" + msg + "</div>");
			tr.show("fast");
		},
		/**
		 * 显示全局提示信息
		 * todo 根据后台返回的错误信息来提示
		 */
		show_ajax_msg         : function (json) {
			var g_msg = $('#g_msg');
			g_msg.html(json.msg);
			g_msg.show();
		},
		/**
		 * 显示ajax正在提交的信息
		 * @param msg_tr_id 单元行
		 */
		show_info             : function (msg_tr_id, msg) {
			$('#' + msg_tr_id + ' td').html("<div class='ajax_processing'>" + msg + "</div>");
			$('#' + msg_tr_id).show();
		},
		/**
		 * 显示成功的信息
		 * @param msg_tr_id 显示的位置
		 */
		show_succ             : function (msg_tr_id, msg) {
			$('#' + msg_tr_id + ' td').html("<div class='ok_msg'>" + msg + "</div>");
			$('#' + msg_tr_id).show();
		},
		/**
		 *   本函数实现了更人性化的时间提示
		 * @param date_str   传递过来的时间，时间格式如:2010-12-14 18:36:09
		 * @return 人性化时间提醒
		 */
		diff_time             : function (date_str) {
			var date = new Date();
			if (typeof(date_str) != 'string')return date;
			var date_arr = date_str.split(new RegExp("[:| |-]", "ig"));
			var date_obj = new Date(date_arr[0], date_arr[1] - 1, date_arr[2], date_arr[3], date_arr[4], date_arr[5]);
			var date_seconddiff = ( new Date().getTime() - date_obj.getTime() ) / 1000;
			date_str_w = '';
			var mm = Math.ceil(date_seconddiff / 60);
			if (date_seconddiff < 60 * 30) date_str_w = mm < 0 ? 0 : mm + "分钟前 ";
			if (!date_str_w && date_seconddiff < 3600)date_str_w = "1小时前 ";
			if (!date_str_w && date_seconddiff < 3600 * 2)date_str_w = "2小时前 ";
			if (!date_str_w && date_seconddiff < 3600 * 3)date_str_w = "3小时前 ";
			if (!date_str_w && date.getFullYear() == date_arr[0] && date.getMonth() == date_arr[1] - 1 && date.getDate() == date_arr[2])
				date_str_w = "今天 " + date_arr[3] + ':' + date_arr[4];
			if (!date_str_w && date.getFullYear() == date_arr[0] && date.getMonth() == date_arr[1] - 1 && date.getDate() - 1 == date_arr[2])
				date_str_w = "昨天 " + date_arr[3] + ':' + date_arr[4];
			if (!date_str_w && date.getFullYear() == date_arr[0] && date.getMonth() == date_arr[1] - 1 && date.getDate() - 2 == date_arr[2])
				date_str_w = "前天 " + date_arr[3] + ':' + date_arr[4];
			if (!date_str_w && date.getFullYear() == date_arr[0] && date.getMonth() == date_arr[1] - 1)
				date_str_w = (date.getMonth() + 1) + "月" + date_arr[2] + "号 " + date_arr[3] + ':' + date_arr[4];
			if (!date_str_w && date.getFullYear() == date_arr[0])
				date_str_w = "今年 " + date_arr[1] + "月" + date_arr[2] + "号 " + date_arr[3] + ':' + date_arr[4];
			if (!date_str_w && date.getFullYear() - 1 == date_arr[0])
				date_str_w = "去年 " + date_arr[1] + "月" + date_arr[2] + "号 " + date_arr[3] + ':' + date_arr[4];
			return date_str_w;
		}

	};
}();




